home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A)[a].zip / Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A)[a].po / LINE.MAGICIAN.S < prev    next >
Text File  |  1996-12-24  |  4KB  |  138 lines

  1. *
  2. * LINE.MAGICIAN Source Code
  3. * BY DAVID HARRIS
  4. * COPYRIGHT (C) 1989
  5. * MICROSPARC, INC.
  6. * CONCORD, MA 01742
  7. *
  8.  
  9.           ORG $8000
  10.  
  11. PROGRAM   EQU $67        ; PROGRAM START POINTER
  12. LINE      EQU $FB        ; POINTER TO PRESENT LINE
  13. NEXT      EQU $FD        ; POINTER TO NEXT LINE
  14.  
  15. REM       EQU #$B2       ; TOKEN FOR REM
  16.  
  17. * Main Entry Point
  18.  
  19. MAIN      LDA PROGRAM    ; GET START LSB
  20.           STA LINE
  21.           LDA PROGRAM+1  ; GET START MSB
  22.           STA LINE+1
  23.  
  24. LOOP      LDY #$00       ; INDIRECT INDEXING
  25.           CLC
  26.           LDA (LINE),Y   ; LOW POINTER TO NEXT LINE
  27.           STA NEXT
  28.           BNE :1         ; NOT A NULL POINTER
  29.           SEC            ; POSSIBLE NULL POINTER
  30. :1        INY
  31.           LDA (LINE),Y   ; HIGH POINTER TO NEXT LINE
  32.           STA NEXT+1
  33.           BNE GOOD       ; NOT A NULL POINTER
  34.           BCC GOOD       ; NOT A NULL POINTER
  35.           RTS            ; END OF PROGRAM
  36.  
  37. GOOD      INY
  38.           INY            ; SKIP LSB OF LINENUM
  39.           LDA (LINE),Y   ; MSB OF LINENUM
  40.           CMP #$F7       ; GREATER THAN 63232
  41.           BLT NOSHIFT    ; NO--NEXT LINE
  42.           CMP #$FA       ; GREATER THAN 63999
  43.           BGE NOSHIFT
  44.           CLC
  45.           ADC #$04       ; MOVE ABOVE 63999
  46.           STA (LINE),Y   ; AND REPLACE
  47.  
  48.           INY
  49.           LDA (LINE),Y   ; GET NEXT BYTE
  50.           CMP #REM       ; IS IT A REM
  51.           BNE NOSHIFT    ; NO, SKIP TO NEXT LINE
  52.           TYA
  53.           CLC
  54.           ADC LINE       ; SET LINE PTR TO POSITION
  55.           STA LINE
  56.           LDA #$00
  57.           ADC LINE+1
  58.           STA LINE+1
  59.           LDY #$00
  60.  
  61. CHANGE    LDA (LINE),Y   ; CHANGE ` FOR BACKSPACE
  62.           BEQ NOSHIFT    ; DONE WITH LINE
  63.           CMP #$60       ; IS IT A `
  64.           BNE :1         ; NO
  65.           LDA #$08       ; BACKSPACE
  66.           STA (LINE),Y   ; REPLACE `
  67. :1        INY            ; NEXT BYTE
  68.           CLC
  69.           BCC CHANGE     ; ALWAYS
  70.  
  71. NOSHIFT   LDA NEXT       ; NEXT LINE
  72.           STA LINE
  73.           LDA NEXT+1
  74.           STA LINE+1
  75.           CLC
  76.           BCC LOOP       ; ALWAYS
  77.  
  78. * Undo Entry Point
  79.  
  80. UNDO      LDA PROGRAM    ; GET START LSB
  81.           STA LINE
  82.           LDA PROGRAM+1  ; GET START MSB
  83.           STA LINE+1
  84.  
  85. LOOP2     LDY #$00       ; INDIRECT INDEXING
  86.           CLC
  87.           LDA (LINE),Y   ; LOW POINTER TO NEXT LINE
  88.           STA NEXT
  89.           BNE :1         ; NOT A NULL POINTER
  90.           SEC            ; POSSIBLE NULL POINTER
  91. :1        INY
  92.           LDA (LINE),Y   ; HIGH POINTER TO NEXT LINE
  93.           STA NEXT+1
  94.           BNE GOOD2      ; NOT A NULL POINTER
  95.           BCC GOOD2      ; NOT A NULL POINTER
  96.           RTS            ; END OF PROGRAM
  97.  
  98. GOOD2     INY
  99.           INY            ; SKIP LSB OF LINENUM
  100.           LDA (LINE),Y   ; MSB OF LINENUM
  101.           CMP #$FA       ; LESS THAN 63999
  102.           BLT NOSHIFT2
  103.           SEC
  104.           SBC #$04       ; MOVE BELOW 63999
  105.           STA (LINE),Y   ; AND REPLACE
  106.  
  107.           INY
  108.           LDA (LINE),Y   ; GET NEXT BYTE
  109.           CMP #REM       ; IS IS A REM
  110.           BNE NOSHIFT2   ; NO, SKIP TO NEXT LINE
  111.           TYA
  112.           CLC
  113.           ADC LINE       ; SET LINE POINTER TO AFTER REM
  114.           STA LINE
  115.           LDA #$00
  116.           ADC LINE+1
  117.           STA LINE+1
  118.           LDY #$00
  119.  
  120. CHANGE2   LDA (LINE),Y   ; CHANGE BACKSPACE FOR `
  121.           BEQ NOSHIFT2   ; DONE WITH LINE
  122.           CMP #$08       ; IS IT A BACKSPACE
  123.           BNE :1
  124.           LDA #$60       ; `
  125.           STA (LINE),Y
  126. :1        INY            ; NEXT BYTE
  127.           CLC
  128.           BCC CHANGE2    ; ALWAYS
  129.  
  130. NOSHIFT2  LDA NEXT       ; NEXT LINE
  131.           STA LINE
  132.           LDA NEXT+1
  133.           STA LINE+1
  134.           CLC
  135.           BCC LOOP2      ; ALWAYS
  136.  
  137.           LST OFF
  138.